package com.db.util;

import javax.swing.*;
import java.sql.*;
import java.util.ResourceBundle;

//数据库连接和关闭工具类
public class DButils {
    //将构造方法私有化，无法创建工具类的对象
    private DButils(){}
    private static final ThreadLocal<Connection> tl = new ThreadLocal<>();


    //静态代码块，。
    //注册驱动只需要执行一次，使用静态代码块的方式注册驱动，类加载的时候才会执行一次
    static{
        //捕捉异常
        try {
            //使用放射机制，类加载的方式注册驱动，Driver类，类加载时会进行驱动的注册操作，直接使用即可
            ResourceBundle bundle = ResourceBundle.getBundle("com/db/config/jdbc");
            String driver = bundle.getString("driverClassName");
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //1.连接数据库方法

    //返回一个数据库连接对象，
    public static Connection getConnection() {



        try {
            Connection conn = tl.get();
            if(conn == null){

                //绑定资源配置文件：jdbc1，jdbc1中存放着获取数据库连接所需的url（链接地址） user（用户），password（密码）
                ResourceBundle bundle = ResourceBundle.getBundle("com/db/config/jdbc");
                String url = bundle.getString("url");
                String user = bundle.getString("user");
                String password = bundle.getString("password");

                //调用DriverManager.getConnection方法，获取连接对象，
                conn = DriverManager.getConnection(url,user,password);
                tl.set( conn );

            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        //将数据库连接对象使用return返回
        return tl.get();
    }

    //2.释放资源方法
    //定义形式参数，接收调用时传递的实参（需要释放的对象）
    public static void close(Connection conn, Statement ps, ResultSet rs){
        //判读资源对象是否为空
        if (rs != null) {
            //捕捉异常
            try{
                //调用close方法释放资源
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //判读资源对象是否为空
        if (ps != null) {
            //捕捉异常
            try{
                //调用close方法释放资源
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //判读资源对象是否为空
        if (conn != null) {
            //捕捉异常
            try{
                //调用close方法释放资源
                conn.close();
                tl.remove();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }


}
